use clap::builder::Str;
use graphql_client::{reqwest::post_graphql_blocking as post_graphql, GraphQLQuery};
use serde_json::json;

use self::user_data::UserInput;

use super::{get_client, REQ_URL};

#[derive(GraphQLQuery)]
#[graphql(
    query_path = "graphql/query_user.graphql",
    schema_path = "graphql/schema.graphql",
    response_derives = "Serialize,PartialEq",
    normalization = "rust",
    skip_serializing_none
)]
struct UserData;

pub fn update_data(input: String) -> String {
    let v = user_data::Variables {
        input: input.into(),
    };
    let post_graphql = post_graphql::<UserData, _>(get_client(), &REQ_URL[..], v);
    // let r = post_graphql
    //     .inspect(|r| {
    //         r.data(|d| d.new.base_query_result.result);
    //     })
    //     .unwrap();
    post_graphql
        .map(|r| r.data.map(|d| d.new.base_query_result.result).unwrap())
        .unwrap()
}

impl From<String> for UserInput {
    fn from(value: String) -> Self {
        let js = json!(value);
        UserInput {
            id: js.get("id").unwrap().as_str().map(|s| s.to_string()),
            name: js
                .get("name")
                .unwrap()
                .as_str()
                .map(|s| s.to_string())
                .unwrap(),
            sex: js.get("sex").unwrap().as_str().map(|s| s.to_string()),
            age: js.get("age").unwrap().as_str().map(|s| s.to_string()),
            phone: js
                .get("phone")
                .unwrap()
                .as_str()
                .map(|s| s.to_string())
                .unwrap(),
            email: js.get("email").unwrap().as_str().map(|s| s.to_string()),
            identity_card: js
                .get("identity_card")
                .unwrap()
                .as_str()
                .map(|s| s.to_string()),
            social_security_card: js
                .get("social_security_card")
                .unwrap()
                .as_str()
                .map(|s| s.to_string()),
            medicare_card: js
                .get("medicare_card")
                .unwrap()
                .as_str()
                .map(|s| s.to_string()),
            password: js.get("password").unwrap().as_str().map(|s| s.to_string()),
        }
    }
}
